import { Context, Schema, h } from 'koishi'

export const name = 'nolink'

export interface Config {
  domainWhiteList: string[]
  enableGroupHint: boolean
}

export const Config: Schema<Config> = Schema.intersect([

  Schema.object({
    domainWhiteList: Schema.array(Schema.string().role('link'))
    .role('table').default(["bilibili.com", "b23.tv"])
    .description("域名白名单"),
    enableGroupHint: Schema.boolean()
    .default(true)
    .description("启用群组提示")
  }).description("基础配置"),



])

// 优化后的正则表达式，匹配并捕获域名部分
const urlRegex = /\b(?:https?:\/\/|www\.)?([a-zA-Z0-9-]+\.[a-zA-Z]{2,}(?:\.[a-zA-Z]{2,})?)(?:\/[^\s]*)?/gi;

// (?:https?:\/\/|www\.)? 可选前缀

// 看看这个视频：https://www.youtube.com/watch?v=dQw4w9WgXcQ
// [
//   'https://www.youtube.com/watch?v=dQw4w9WgXcQ', // match[0]: 完整匹配
//   'youtube.com'                                 // match[1]: 第一个捕获组，即域名
// ]
// 这是我的博客：blog.example.co.uk
// [
//   'blog.example.co.uk', // match[0]: 完整匹配
//   'example.co.uk'       // match[1]: 第一个捕获组，即域名
// ]

export function apply(ctx: Context, config: Config) {

  ctx.middleware(async (session, next) => {
    // const matches = session.content.matchAll(urlRegex);

    let textStr = '';
    for ( const e of h.parse(session.content) ){
      if ( e.type === 'text' ) {
        textStr += e.attrs.content;
      }
    }
    const matches = textStr.matchAll(urlRegex);

    let hasBlocked = false;
    for (const match of matches) {
      // 优化后，直接从第一个捕获组获取域名
      const domain = match[1];
      // 检查域名是否在白名单中
      if (domain && !config.domainWhiteList.some(white => domain.endsWith(white))) {
        hasBlocked = true;
        break;
      }
    }
    if (hasBlocked) {
      await session.bot.deleteMessage(session.channelId, session.messageId);
      if (config.enableGroupHint)
        await session.send(`${h.quote(session.messageId)}检测到疑似网站链接，消息已撤回。`)
      return next();
    }
    return next();
  })

}